package com.lishem.top100._08tree;


import com.lishem.common.TreeNode;

/**
 * https://leetcode.cn/problems/diameter-of-binary-tree/
 * <p>
 * 给你一棵二叉树的根节点，返回该树的直径 。
 * <p>
 * 二叉树的直径是指树中任意两个节点之间最长路径的长度。这条路径可能经过也可能不经过根节点 root 。
 * <p>
 * 两节点之间路径的长度由它们之间边数表示。
 * <p>
 * 输入：root = [1,2,3,4,5]
 * <p>
 * 输出：3
 * <p>
 * 解释：3 ，取路径 [4,2,1,3] 或 [5,2,1,3] 的长度。
 * <p>
 * 示例 2：
 * <p>
 * 输入：root = [1,2]
 * <p>
 * 输出：1
 */
public class _05LetCode543_二叉树的直径 {

    int res;

    public int diameterOfBinaryTree(TreeNode root) {
        res = 1;
        maxDeep(root);
        return res - 1;
    }

    private int maxDeep(TreeNode node) {
        if (node == null) {
            return 0;
        }
        int leftDepth = maxDeep(node.left);
        int rightDepth = maxDeep(node.right);
        res = Math.max(res, leftDepth + rightDepth + 1);
        return Math.max(leftDepth, rightDepth) + 1;
    }

    public static void main(String[] args) {
        _05LetCode543_二叉树的直径 sol = new _05LetCode543_二叉树的直径();
        TreeNode root = new TreeNode(1);
        root.left = new TreeNode(2);
        root.right = new TreeNode(3);
        root.left.left = new TreeNode(4);
        root.left.right = new TreeNode(5);
        System.out.println(sol.diameterOfBinaryTree(root));
    }


}

